// Package cli 提供CLI命令定义和处理
package cli

import (
	"fmt"
	"os"

	"github.com/dean2027/aish/pkg/config"
	"github.com/fatih/color"
	"github.com/urfave/cli/v2"
)

// BuildCommands 构建CLI命令结构
func BuildCommands() []*cli.Command {
	return []*cli.Command{
		{
			Name:    "config",
			Aliases: []string{"cfg"},
			Usage:   "配置管理命令",
			Subcommands: []*cli.Command{
				buildInitCommand(),
				buildShowCommand(),
			},
		},
	}
}

// BuildFlags 构建CLI标志
func BuildFlags() []cli.Flag {
	return []cli.Flag{
		&cli.StringFlag{
			Name:    "config",
			Aliases: []string{"c"},
			Usage:   "配置文件路径 (默认: $HOME/.aish/conf.yml)",
		},
		&cli.StringFlag{
			Name:    "api-key",
			Aliases: []string{"k"},
			Usage:   "OpenAI API密钥",
			EnvVars: []string{"OPENAI_API_KEY"},
		},
		&cli.StringFlag{
			Name:    "base-url",
			Aliases: []string{"u"},
			Usage:   "API基础URL",
			EnvVars: []string{"OPENAI_BASE_URL"},
		},
		&cli.StringFlag{
			Name:    "model",
			Aliases: []string{"m"},
			Usage:   "使用的AI模型",
			EnvVars: []string{"OPENAI_MODEL"},
		},
		&cli.IntFlag{
			Name:  "max-iterations",
			Usage: "最大ReAct循环次数",
		},
		&cli.IntFlag{
			Name:  "max-history",
			Usage: "最大保留的历史消息数量",
		},
		&cli.IntFlag{
			Name:    "command-timeout",
			Aliases: []string{"ct"},
			Usage:   "命令执行超时时间(秒)",
		},
		&cli.IntFlag{
			Name:  "reasoning-timeout",
			Usage: "AI推理超时时间(秒)",
		},
		&cli.BoolFlag{
			Name:    "skip-confirm",
			Aliases: []string{"y"},
			Usage:   "跳过用户确认提示(危险操作)",
			EnvVars: []string{"AISH_SKIP_CONFIRM"},
		},
	}
}

// buildInitCommand 构建配置初始化命令
func buildInitCommand() *cli.Command {
	return &cli.Command{
		Name:   "init",
		Usage:  "初始化默认配置文件",
		Action: HandleInitConfig,
		Flags: []cli.Flag{
			&cli.StringFlag{
				Name:    "config",
				Aliases: []string{"c"},
				Usage:   "指定配置文件路径",
			},
			&cli.BoolFlag{
				Name:  "force",
				Usage: "强制覆盖已存在的配置文件",
			},
		},
	}
}

// buildShowCommand 构建配置显示命令
func buildShowCommand() *cli.Command {
	return &cli.Command{
		Name:   "show",
		Usage:  "显示当前配置",
		Action: HandleShowConfig,
		Flags: []cli.Flag{
			&cli.StringFlag{
				Name:    "config",
				Aliases: []string{"c"},
				Usage:   "指定配置文件路径",
			},
		},
	}
}

// HandleInitConfig 处理配置初始化命令
func HandleInitConfig(c *cli.Context) error {
	configPath := c.String("config")
	force := c.Bool("force")

	// 获取实际配置文件路径
	actualPath, err := config.GetConfigPath(configPath)
	if err != nil {
		return fmt.Errorf("获取配置文件路径失败: %v", err)
	}

	// 检查文件是否已存在
	if _, err := os.Stat(actualPath); err == nil && !force {
		return fmt.Errorf("配置文件已存在: %s\n使用 --force 参数强制覆盖", actualPath)
	}

	// 创建默认配置
	cfg := config.DefaultConfig()

	// 保存配置文件
	if err := cfg.SaveConfig(configPath); err != nil {
		return fmt.Errorf("创建配置文件失败: %v", err)
	}

	// 显示成功信息
	showInitSuccess(actualPath)
	return nil
}

// HandleShowConfig 处理配置显示命令
func HandleShowConfig(c *cli.Context) error {
	configPath := c.String("config")

	// 加载配置
	cfg, err := config.LoadConfig(configPath)
	if err != nil {
		return fmt.Errorf("加载配置失败: %v", err)
	}

	// 应用环境变量
	cfg.MergeWithEnvVars()

	// 显示配置信息
	showConfigInfo(cfg)
	return nil
}

// showInitSuccess 显示初始化成功信息
func showInitSuccess(configPath string) {
	color.New(color.FgGreen).Printf("✓ 配置文件已创建: %s\n", configPath)
	fmt.Println()
	color.New(color.FgCyan).Println("请编辑配置文件并设置你的 API 密钥:")
	fmt.Printf("  api_key: \"your-api-key-here\"\n")
	fmt.Println()
	color.New(color.FgYellow).Println("你也可以通过环境变量设置 API 密钥:")
	fmt.Printf("  export OPENAI_API_KEY=\"your-api-key-here\"\n")
}

// showConfigInfo 显示配置信息
func showConfigInfo(cfg *config.Config) {
	color.New(color.FgCyan, color.Bold).Println("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
	color.New(color.FgCyan, color.Bold).Println("            AISH 当前配置")
	color.New(color.FgCyan, color.Bold).Println("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
	fmt.Println()

	// API 配置
	showAPIConfig(cfg)

	// 执行配置
	showExecutionConfig(cfg)

	// 安全配置
	showSecurityConfig(cfg)

	// 文件信息
	showFileInfo(cfg)

	color.New(color.FgHiBlack).Println("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
	fmt.Println()

	// 配置优先级说明
	color.New(color.FgCyan).Println("配置优先级: CLI参数 > 环境变量 > 配置文件 > 默认值")
}

// showAPIConfig 显示API配置
func showAPIConfig(cfg *config.Config) {
	color.New(color.FgGreen, color.Bold).Println("📞 API 配置")
	color.New(color.FgWhite).Print("  API 地址: ")
	color.New(color.FgYellow).Println(cfg.BaseURL)
	color.New(color.FgWhite).Print("  AI 模型:  ")
	color.New(color.FgYellow).Println(cfg.Model)
	color.New(color.FgWhite).Print("  API 密钥: ")
	if cfg.APIKey != "" {
		maskedKey := cfg.APIKey
		if len(maskedKey) > 8 {
			maskedKey = maskedKey[:4] + "****" + maskedKey[len(maskedKey)-4:]
		}
		color.New(color.FgGreen).Printf("✓ 已设置 (%s)\n", maskedKey)
	} else {
		color.New(color.FgRed).Println("✗ 未设置")
	}
	color.New(color.FgWhite).Print("  搜索密钥: ")
	if cfg.SerpApiKey != "" {
		maskedKey := cfg.SerpApiKey
		if len(maskedKey) > 8 {
			maskedKey = maskedKey[:4] + "****" + maskedKey[len(maskedKey)-4:]
		}
		color.New(color.FgGreen).Printf("✓ 已设置 (%s)\n", maskedKey)
	} else {
		color.New(color.FgYellow).Println("○ 未设置 (搜索功能将不可用)")
	}
	fmt.Println()
}

// showExecutionConfig 显示执行配置
func showExecutionConfig(cfg *config.Config) {
	color.New(color.FgBlue, color.Bold).Println("⚙️  执行配置")
	color.New(color.FgWhite).Printf("  最大循环次数: %d\n", cfg.MaxIterations)
	color.New(color.FgWhite).Printf("  历史记录数量: %d\n", cfg.MaxHistory)
	color.New(color.FgWhite).Printf("  命令执行超时: %d秒\n", cfg.CommandTimeout)
	color.New(color.FgWhite).Printf("  AI推理超时: %d秒\n", cfg.ReasoningTimeout)
	fmt.Println()
}

// showSecurityConfig 显示安全配置
func showSecurityConfig(cfg *config.Config) {
	color.New(color.FgMagenta, color.Bold).Println("🛡️  安全配置")
	color.New(color.FgWhite).Print("  跳过确认提示: ")
	if cfg.SkipConfirm {
		color.New(color.FgRed).Println("✓ 已启用 (危险)")
	} else {
		color.New(color.FgGreen).Println("✗ 禁用 (安全)")
	}
	fmt.Println()
}

// showFileInfo 显示文件信息
func showFileInfo(cfg *config.Config) {
	color.New(color.FgHiBlack, color.Bold).Println("📁 文件信息")
	if cfg.ConfigFile != "" {
		color.New(color.FgHiBlack).Printf("  配置文件: %s\n", cfg.ConfigFile)
		if _, err := os.Stat(cfg.ConfigFile); err == nil {
			color.New(color.FgGreen).Println("  文件状态: ✓ 存在")
		} else {
			color.New(color.FgRed).Println("  文件状态: ✗ 不存在")
		}
	} else {
		color.New(color.FgHiBlack).Println("  配置文件: 未使用")
	}
	fmt.Println()
}
